package org.wikinews.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.End;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.Transactional;
import org.jboss.seam.faces.FacesMessages;
import org.wikinews.model.Post;
import org.wikinews.model.Tag;
import org.wikinews.model.Usuario;
import org.wikinews.repo.PostRepo;
import org.wikinews.service.PostService;

/**
 * Controller para criação e alteração de posts.
 * 
 * @author leonardo
 *
 */
@Name("postCtrl")
@Scope(ScopeType.CONVERSATION)
public class PostCtrl implements Serializable {

	private static final long serialVersionUID = 6612582663398485318L;

	@In
	private FacesMessages facesMessages;

	@In
	private PostRepo postRepo;
	
	@In
	private Usuario usuario;
	
	@In
	private PostService postService;
	
	private Post post;
	
	private List<Post> postsEncontradosPesquisa;
	
	private Tag pesquisaTag = new Tag();
	
	private String pesquisaTexto;
	
	private Date pesquisaDataInicial;
	
	private Date pesquisaDataFinal;
	
	private String tagsPostTexto;
	
	public Post getPost() {
		return post;
	}

	public void setPost(Post post) {
		this.post = post;
	}

	public void setPesquisaTag(Tag pesquisaTag) {
		this.pesquisaTag = pesquisaTag;
	}

	public Tag getPesquisaTag() {
		return pesquisaTag;
	}
	
	public String getPesquisaTexto() {
		return pesquisaTexto;
	}

	public void setPesquisaTexto(String pesquisaTexto) {
		this.pesquisaTexto = pesquisaTexto;
	}
	
	public Date getPesquisaDataInicial() {
		return pesquisaDataInicial;
	}

	public void setPesquisaDataInicial(Date pesquisaDataInicial) {
		this.pesquisaDataInicial = pesquisaDataInicial;
	}

	public Date getPesquisaDataFinal() {
		return pesquisaDataFinal;
	}

	public void setPesquisaDataFinal(Date pesquisaDataFinal) {
		this.pesquisaDataFinal = pesquisaDataFinal;
	}

	public String getTagsPostTexto() {
		return tagsPostTexto;
	}

	public void setTagsPostTexto(String tagsPostTexto) {
		this.tagsPostTexto = tagsPostTexto;
	}

	public List<Post> getPostsEncontradosPesquisa() {
		return postsEncontradosPesquisa;
	}
	
	@Begin(join = true)
	public String novo() {
		post = new Post(usuario, new Date());
		post.setTagList(new ArrayList<Tag>());
		return "/Post.xhtml";
	}
	
	@Begin(join = true)
	public String editar(Long postId) {
		post = postRepo.findById(Post.class, postId);

		return "/Post.xhtml";
	}
	
	@End
	public String salvar() {
		
		postService.adicionarListaTagsPost(post, tagsPostTexto);
		
		postRepo.persist(post);

		facesMessages.add("Post foi criado com sucesso.");

		return "/home.xhtml";
	}
	
	@Transactional
	public String pesquisarPosts() {
		postsEncontradosPesquisa = postRepo.getListaByFiltroPesquisa(pesquisaTexto, pesquisaTag, pesquisaDataInicial, pesquisaDataFinal);
		return "/PostsEncontrados.xhtml";
	}

	@Transactional
	public String limparPesquisaPosts() {
		pesquisaTexto = null;
		pesquisaTag = new Tag();
		pesquisaDataInicial = null;
		pesquisaDataFinal = null;
		postsEncontradosPesquisa = null;
		return null;
	}
	
	@Transactional
	public String pesquisarPostsPorTag() {
		postsEncontradosPesquisa = postRepo.getAllByTag(pesquisaTag);
		return "/PostsPorTag.xhtml";
	}
	
}
